home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / distutils / command / register.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  10KB  |  285 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. """distutils.command.register
  5.  
  6. Implements the Distutils 'register' command (register with the repository).
  7. """
  8. __revision__ = '$Id: register.py,v 1.7.4.1 2005/03/31 14:16:30 doerwalter Exp $'
  9. import sys
  10. import os
  11. import string
  12. import urllib2
  13. import getpass
  14. import urlparse
  15. import StringIO
  16. import ConfigParser
  17. from distutils.core import Command
  18. from distutils.errors import *
  19.  
  20. class register(Command):
  21.     description = 'register the distribution with the Python package index'
  22.     DEFAULT_REPOSITORY = 'http://www.python.org/pypi'
  23.     user_options = [
  24.         ('repository=', 'r', 'url of repository [default: %s]' % DEFAULT_REPOSITORY),
  25.         ('list-classifiers', None, 'list the valid Trove classifiers'),
  26.         ('show-response', None, 'display full response text from server')]
  27.     boolean_options = [
  28.         'verify',
  29.         'show-response',
  30.         'list-classifiers']
  31.     
  32.     def initialize_options(self):
  33.         self.repository = None
  34.         self.show_response = 0
  35.         self.list_classifiers = 0
  36.  
  37.     
  38.     def finalize_options(self):
  39.         if self.repository is None:
  40.             self.repository = self.DEFAULT_REPOSITORY
  41.         
  42.  
  43.     
  44.     def run(self):
  45.         self.check_metadata()
  46.         if self.dry_run:
  47.             self.verify_metadata()
  48.         elif self.list_classifiers:
  49.             self.classifiers()
  50.         else:
  51.             self.send_metadata()
  52.  
  53.     
  54.     def check_metadata(self):
  55.         '''Ensure that all required elements of meta-data (name, version,
  56.            URL, (author and author_email) or (maintainer and
  57.            maintainer_email)) are supplied by the Distribution object; warn if
  58.            any are missing.
  59.         '''
  60.         metadata = self.distribution.metadata
  61.         missing = []
  62.         for attr in ('name', 'version', 'url'):
  63.             if not hasattr(metadata, attr) and getattr(metadata, attr):
  64.                 missing.append(attr)
  65.                 continue
  66.         
  67.         if missing:
  68.             self.warn('missing required meta-data: ' + string.join(missing, ', '))
  69.         
  70.         if metadata.author:
  71.             if not metadata.author_email:
  72.                 self.warn("missing meta-data: if 'author' supplied, " + "'author_email' must be supplied too")
  73.             
  74.         elif metadata.maintainer:
  75.             if not metadata.maintainer_email:
  76.                 self.warn("missing meta-data: if 'maintainer' supplied, " + "'maintainer_email' must be supplied too")
  77.             
  78.         else:
  79.             self.warn('missing meta-data: either (author and author_email) ' + 'or (maintainer and maintainer_email) ' + 'must be supplied')
  80.  
  81.     
  82.     def classifiers(self):
  83.         ''' Fetch the list of classifiers from the server.
  84.         '''
  85.         response = urllib2.urlopen(self.repository + '?:action=list_classifiers')
  86.         print response.read()
  87.  
  88.     
  89.     def verify_metadata(self):
  90.         ''' Send the metadata to the package index server to be checked.
  91.         '''
  92.         (code, result) = self.post_to_server(self.build_post_data('verify'))
  93.         print 'Server response (%s): %s' % (code, result)
  94.  
  95.     
  96.     def send_metadata(self):
  97.         """ Send the metadata to the package index server.
  98.  
  99.             Well, do the following:
  100.             1. figure who the user is, and then
  101.             2. send the data as a Basic auth'ed POST.
  102.  
  103.             First we try to read the username/password from $HOME/.pypirc,
  104.             which is a ConfigParser-formatted file with a section
  105.             [server-login] containing username and password entries (both
  106.             in clear text). Eg:
  107.  
  108.                 [server-login]
  109.                 username: fred
  110.                 password: sekrit
  111.  
  112.             Otherwise, to figure who the user is, we offer the user three
  113.             choices:
  114.  
  115.              1. use existing login,
  116.              2. register as a new user, or
  117.              3. set the password to a random string and email the user.
  118.  
  119.         """
  120.         choice = 'x'
  121.         username = password = ''
  122.         config = None
  123.         if os.environ.has_key('HOME'):
  124.             rc = os.path.join(os.environ['HOME'], '.pypirc')
  125.             if os.path.exists(rc):
  126.                 print 'Using PyPI login from %s' % rc
  127.                 config = ConfigParser.ConfigParser()
  128.                 config.read(rc)
  129.                 username = config.get('server-login', 'username')
  130.                 password = config.get('server-login', 'password')
  131.                 choice = '1'
  132.             
  133.         
  134.         choices = '1 2 3 4'.split()
  135.         while choice not in choices:
  136.             print 'We need to know who you are, so please choose either:\n 1. use your existing login,\n 2. register as a new user,\n 3. have the server generate a new password for you (and email it to you), or\n 4. quit\nYour selection [default 1]: ',
  137.             choice = raw_input()
  138.             if not choice:
  139.                 choice = '1'
  140.                 continue
  141.             if choice not in choices:
  142.                 print 'Please choose one of the four options!'
  143.                 continue
  144.         if choice == '1':
  145.             while not username:
  146.                 username = raw_input('Username: ')
  147.             while not password:
  148.                 password = getpass.getpass('Password: ')
  149.             auth = urllib2.HTTPPasswordMgr()
  150.             host = urlparse.urlparse(self.repository)[1]
  151.             auth.add_password('pypi', host, username, password)
  152.             (code, result) = self.post_to_server(self.build_post_data('submit'), auth)
  153.             print 'Server response (%s): %s' % (code, result)
  154.             if os.environ.has_key('HOME') and config is None and code == 200:
  155.                 rc = os.path.join(os.environ['HOME'], '.pypirc')
  156.                 print 'I can store your PyPI login so future submissions will be faster.'
  157.                 print '(the login will be stored in %s)' % rc
  158.                 choice = 'X'
  159.                 while choice.lower() not in 'yn':
  160.                     choice = raw_input('Save your login (y/N)?')
  161.                     if not choice:
  162.                         choice = 'n'
  163.                         continue
  164.                 if choice.lower() == 'y':
  165.                     f = open(rc, 'w')
  166.                     f.write('[server-login]\nusername:%s\npassword:%s\n' % (username, password))
  167.                     f.close()
  168.                     
  169.                     try:
  170.                         os.chmod(rc, 384)
  171.  
  172.                 
  173.             
  174.         elif choice == '2':
  175.             data = {
  176.                 ':action': 'user' }
  177.             data['name'] = data['password'] = data['email'] = ''
  178.             data['confirm'] = None
  179.             while not data['name']:
  180.                 data['name'] = raw_input('Username: ')
  181.             while data['password'] != data['confirm']:
  182.                 while not data['password']:
  183.                     data['password'] = getpass.getpass('Password: ')
  184.                 while not data['confirm']:
  185.                     data['confirm'] = getpass.getpass(' Confirm: ')
  186.                 if data['password'] != data['confirm']:
  187.                     data['password'] = ''
  188.                     data['confirm'] = None
  189.                     print "Password and confirm don't match!"
  190.                     continue
  191.             while not data['email']:
  192.                 data['email'] = raw_input('   EMail: ')
  193.             (code, result) = self.post_to_server(data)
  194.             if code != 200:
  195.                 print 'Server response (%s): %s' % (code, result)
  196.             else:
  197.                 print 'You will receive an email shortly.'
  198.                 print 'Follow the instructions in it to complete registration.'
  199.         elif choice == '3':
  200.             data = {
  201.                 ':action': 'password_reset' }
  202.             data['email'] = ''
  203.             while not data['email']:
  204.                 data['email'] = raw_input('Your email address: ')
  205.             (code, result) = self.post_to_server(data)
  206.             print 'Server response (%s): %s' % (code, result)
  207.         
  208.  
  209.     
  210.     def build_post_data(self, action):
  211.         meta = self.distribution.metadata
  212.         data = {
  213.             ':action': action,
  214.             'metadata_version': '1.0',
  215.             'name': meta.get_name(),
  216.             'version': meta.get_version(),
  217.             'summary': meta.get_description(),
  218.             'home_page': meta.get_url(),
  219.             'author': meta.get_contact(),
  220.             'author_email': meta.get_contact_email(),
  221.             'license': meta.get_licence(),
  222.             'description': meta.get_long_description(),
  223.             'keywords': meta.get_keywords(),
  224.             'platform': meta.get_platforms(),
  225.             'classifiers': meta.get_classifiers(),
  226.             'download_url': meta.get_download_url() }
  227.         return data
  228.  
  229.     
  230.     def post_to_server(self, data, auth = None):
  231.         ''' Post a query to the server, and return a string response.
  232.         '''
  233.         boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
  234.         sep_boundary = '\n--' + boundary
  235.         end_boundary = sep_boundary + '--'
  236.         body = StringIO.StringIO()
  237.         for key, value in data.items():
  238.             if type(value) != type([]):
  239.                 value = [
  240.                     value]
  241.             
  242.             for value in value:
  243.                 value = unicode(value).encode('utf-8')
  244.                 body.write(sep_boundary)
  245.                 body.write('\nContent-Disposition: form-data; name="%s"' % key)
  246.                 body.write('\n\n')
  247.                 body.write(value)
  248.                 if value and value[-1] == '\r':
  249.                     body.write('\n')
  250.                     continue
  251.             
  252.         
  253.         body.write(end_boundary)
  254.         body.write('\n')
  255.         body = body.getvalue()
  256.         headers = {
  257.             'Content-type': 'multipart/form-data; boundary=%s; charset=utf-8' % boundary,
  258.             'Content-length': str(len(body)) }
  259.         req = urllib2.Request(self.repository, body, headers)
  260.         opener = urllib2.build_opener(urllib2.HTTPBasicAuthHandler(password_mgr = auth))
  261.         data = ''
  262.         
  263.         try:
  264.             result = opener.open(req)
  265.         except urllib2.HTTPError:
  266.             e = None
  267.             if self.show_response:
  268.                 data = e.fp.read()
  269.             
  270.             result = (e.code, e.msg)
  271.         except urllib2.URLError:
  272.             e = None
  273.             result = (500, str(e))
  274.  
  275.         if self.show_response:
  276.             data = result.read()
  277.         
  278.         result = (200, 'OK')
  279.         if self.show_response:
  280.             print '-' * 75, data, '-' * 75
  281.         
  282.         return result
  283.  
  284.  
  285.